package ar.com.profertil.frances.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import ar.com.profertil.utils.entity.Element;
import ar.com.profertil.utils.entity.RecibirArchivoEntity;

/**
 * The Class ArchivoPagosRecibidoFrances.
 *
 * @author augusto.ferrari@softtek.com
 * 
 * Esta clase representa un archivo de pagos a parsear en formato Idoc. Banco Frances.
 */
public class ArchivoPagosRecibidoFrances implements RecibirArchivoEntity, Serializable {

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = 7258978667701105072L;
	
	//Variables.
	/** The header. */
	private Header header;
	
	/** The detalle a. */
	private DetalleA[] detalleA;
	
	/** The detalle b. */
	private DetalleB[] detalleB;
	
	/** The detalle c. */
	private DetalleC[] detalleC;
	
	/** The detalle d. */
	private DetalleD[] detalleD;
	
	//Constructor.
	/**
	 * Instantiates a new archivo pagos recibido frances.
	 */
	public ArchivoPagosRecibidoFrances() {
		header = new Header();
	}
	
	//Getters y setters para las estructuras.
	/**
	 * Gets the header.
	 *
	 * @return the header
	 */
	public Header getHeader() {
		return header;
	}
	
	/**
	 * Sets the header.
	 *
	 * @param header the new header
	 */
	public void setHeader(Header header) {
		this.header = header;
	}
	
	/**
	 * Gets the detalle a.
	 *
	 * @return the detalle a
	 */
	public DetalleA[] getDetalleA() {
		return detalleA;
	}
	
	/**
	 * Sets the detalle a.
	 *
	 * @param detalleA the new detalle a
	 */
	public void setDetalleA(DetalleA[] detalleA) {
		this.detalleA = detalleA;
	}
	
	/**
	 * Gets the detalle b.
	 *
	 * @return the detalle b
	 */
	public DetalleB[] getDetalleB() {
		return detalleB;
	}
	
	/**
	 * Sets the detalle b.
	 *
	 * @param detalleB the new detalle b
	 */
	public void setDetalleB(DetalleB[] detalleB) {
		this.detalleB = detalleB;
	}
	
	/**
	 * Gets the detalle c.
	 *
	 * @return the detalle c
	 */
	public DetalleC[] getDetalleC() {
		return detalleC;
	}
	
	/**
	 * Sets the detalle c.
	 *
	 * @param detalleC the new detalle c
	 */
	public void setDetalleC(DetalleC[] detalleC) {
		this.detalleC = detalleC;
	}
	
	/**
	 * Gets the detalle d.
	 *
	 * @return the detalle d
	 */
	public DetalleD[] getDetalleD() {
		return detalleD;
	}
	
	/**
	 * Sets the detalle d.
	 *
	 * @param detalleD the new detalle d
	 */
	public void setDetalleD(DetalleD[] detalleD) {
		this.detalleD = detalleD;
	}
	
	//Metodos para inicializar los arreglos.
	/**
	 * Inicializar detalle a.
	 *
	 * @param longitud the longitud
	 */
	public void inicializarDetalleA(int longitud) {
		detalleA = new DetalleA[longitud];
	}
	
	/**
	 * Inicializar detalle b.
	 *
	 * @param longitud the longitud
	 */
	public void inicializarDetalleB(int longitud) {
		detalleB = new DetalleB[longitud];
	}
	
	/**
	 * Inicializar detalle c.
	 *
	 * @param longitud the longitud
	 */
	public void inicializarDetalleC(int longitud) {
		detalleC = new DetalleC[longitud];
	}
	
	/**
	 * Inicializar detalle d.
	 *
	 * @param longitud the longitud
	 */
	public void inicializarDetalleD(int longitud) {
		detalleD = new DetalleD[longitud];
	}
	
	//Metodos para agregarDetalles.
	/**
	 * Agregar detalle a.
	 *
	 * @param posicion the posicion
	 * @param detalleA the detalle a
	 */
	public void agregarDetalleA(int posicion, DetalleA detalleA) {
		this.detalleA[posicion] = detalleA;
	}
	
	/**
	 * Agregar detalle b.
	 *
	 * @param posicion the posicion
	 * @param detalleB the detalle b
	 */
	public void agregarDetalleB(int posicion, DetalleB detalleB) {
		this.detalleB[posicion] = detalleB;
	}
	
	/**
	 * Agregar detalle c.
	 *
	 * @param posicion the posicion
	 * @param detalleC the detalle c
	 */
	public void agregarDetalleC(int posicion, DetalleC detalleC) {
		this.detalleC[posicion] = detalleC;
	}
	
	/**
	 * Agregar detalle d.
	 *
	 * @param posicion the posicion
	 * @param detalleD the detalle d
	 */
	public void agregarDetalleD(int posicion, DetalleD detalleD) {
		this.detalleD[posicion] = detalleD;
	}
	
	/**
	 * Gets the header parser.
	 *
	 * @return the header parser
	 */
	public String getHeaderParser() {
		return header.toString();
	}
	
	/**
	 * Gets the detalle a parser.
	 *
	 * @return the detalle a parser
	 */
	public String[] getDetalleAParser() {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < detalleA.length; i++) {
			DetalleA detalle = detalleA[i];
			list.add(detalle.toString());
		}
		return list.toArray(new String[list.size()]);
	}
	
	/**
	 * Gets the detalle b parser.
	 *
	 * @return the detalle b parser
	 */
	public String[] getDetalleBParser() {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < detalleB.length; i++) {
			DetalleB detalle = detalleB[i];
			list.add(detalle.toString());
		}
		return list.toArray(new String[list.size()]);
	}
	
	/**
	 * Gets the detalle c parser.
	 *
	 * @return the detalle c parser
	 */
	public String[] getDetalleCParser() {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < detalleC.length; i++) {
			DetalleC detalle = detalleC[i];
			list.add(detalle.toString());
		}
		return list.toArray(new String[list.size()]);
	}
	
	/**
	 * Gets the detalle d parser.
	 *
	 * @return the detalle d parser
	 */
	public String[] getDetalleDParser() {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < detalleD.length; i++) {
			DetalleD detalle = detalleD[i];
			list.add(detalle.toString());
		}
		return list.toArray(new String[list.size()]);
	}

	/**
	 * To string.
	 *
	 * @return the string
	 */
	@Override
	public String toString() {
		StringBuffer str = new StringBuffer();
		str.append(header.toString());
		for(DetalleA detalle : detalleA) {
			str.append(detalle.toString());
		}
		for(DetalleB detalle : detalleB) {
			str.append(detalle.toString());
		}
		for(DetalleC detalle : detalleC) {
			str.append(detalle.toString());
		}
		for(DetalleD detalle : detalleD) {
			str.append(detalle.toString());
		}
		return str.toString();
	}
	
	/**
	 * To csv.
	 *
	 * @return the string
	 */
	public String toCSV() {
		StringBuffer str = new StringBuffer();
		str.append(header.toCSVString());
		for(DetalleA detalle : detalleA) {
			str.append(detalle.toCSVString());
		}
		for(DetalleB detalle : detalleB) {
			str.append(detalle.toCSVString());
		}
		for(DetalleC detalle : detalleC) {
			str.append(detalle.toCSVString());
		}
		for(DetalleD detalle : detalleD) {
			str.append(detalle.toCSVString());
		}
		return str.toString();
	}

	/**
	 * Gets the elements.
	 *
	 * @return the elements
	 */
	public List<Element> getElements() {
		List<Element> list = new ArrayList<Element>();
		list.add(header);
		list.addAll(Arrays.asList(detalleA));
		list.addAll(Arrays.asList(detalleB));
		list.addAll(Arrays.asList(detalleC));
		list.addAll(Arrays.asList(detalleD));
		return list;
	}
}
